package token

import (
	"autoDeploy/config"
	"autoDeploy/dao/myselfMysql"
	"autoDeploy/models"
	"fmt"

	"github.com/dgrijalva/jwt-go"

	"time"
)

var db, _ = myselfMysql.CreateMySQLClient(config.MysqlDb)

// GenerateToken
//
// 描述信息：根据用户手机号和角色ID创建token
//
// Param：
//
//	phone ：手机号
//	roleID ：角色ID（uint类型）
//
// Return：
//
//	string ：token
//	error ：错误信息
func GenerateToken(phone string, roleID uint64) (string, error) {
	// 查询用户信息
	user, err := models.GetUserByPhone(db, phone)
	if err != nil {
		return "", err
	}

	// 查询角色信息
	sysRole, err := models.GetSysRoleBySysRoleID(db, roleID)
	if err != nil {
		return "", err
	}

	// 创建一个标准的 Claims
	claims := jwt.MapClaims{
		"exp":       time.Now().Add(config.TokenExpireDuration).Unix(), // 设置 Token 的过期时间为14天
		"issuer":    "shen_cheng_hou",                                  // 设置 Token 的发行者
		"user_id":   user.ID,                                           // 用户ID
		"phone":     phone,                                             // 用户手机号
		"role_id":   roleID,                                            // 用户角色ID（string类型）
		"role_name": sysRole.Name,                                      // 用户角色名称
	}

	// 使用 HS256 算法和密钥签名 Token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// 生成 Token 字符串
	tokenString, err := token.SignedString([]byte(config.SecretKey))
	if err != nil {
		return "", err
	}

	return tokenString, nil
}

// ParseToken
//
// 描述信息：解析token并返回用户ID和角色ID
//
// Param：
//
//	tokenString ：Token字符串
//
// Return：
//
//	userID ：用户ID
//	roleID ：角色ID（uint类型）
//	error ：错误信息
func ParseToken(tokenString string) (uint, uint, error) {
	// 解析 Token
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 确保 Token 使用的是 HS256 签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(config.SecretKey), nil
	})

	if err != nil {
		return 0, 0, err
	}

	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		// 从 Claims 中提取用户ID和角色ID
		userID, ok := claims["user_id"].(float64)
		if !ok {
			return 0, 0, fmt.Errorf("invalid user_id in token")
		}

		roleID, ok := claims["role_id"].(float64) // 修正：先断言为 float64
		if !ok {
			return 0, 0, fmt.Errorf("invalid role_id in token")
		}

		return uint(userID), uint(roleID), nil // 修正：将 float64 转换为 uint
	}
	return 0, 0, fmt.Errorf("invalid token")
}
